﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using R = Szamlazz.Data.Request;

namespace Szamlazz.Data
{ 
	/// <summary>
	/// Számla létrehozási kérelem
	/// </summary>
	public class InvoiceRequest : Validatable
	{
		/// <summary>
		/// Egyedi azonosító
		/// </summary>
		internal Guid Identifier { get; private set; }
		/// <summary>
		/// Kibocsátói információ
		/// </summary>
		internal ProviderInfo Provider { get; private set; }
		/// <summary>
		/// Fejléc információ
		/// </summary>
		public HeaderInfo Header { get; private set; }
		/// <summary>
		/// Vevői információ
		/// </summary>
		public CustomerInfo Customer { get; private set; }
		/// <summary>
		/// Számla tételek
		/// </summary>
		public InvoiceItemCollection Items { get; private set; }
		/// <summary>
		/// Kért példányszám (0-1: csak eredeti példány, 2: eredeti és másodpéldány, 3-: másodpéldányok száma)
		/// </summary>
		public int InstanceCount { get; set; }
		/// <summary>
		/// Kéri az elkészült számla PDF állomány letöltését is
		/// </summary>
		public bool DownloadPdf { get; set; }

		/// <summary>
		/// Visszaadja a számla típusát - nem beállítható érték, a számla létrehozásával szabályozható
		/// </summary>
		public InvoiceType InvoiceType { get; private set; }

		/// <summary>
		/// Konstruktor, létrehozza a kérelmet a kibocsátóhoz
		/// </summary>
		/// <param name="provider">Kibocsátó</param>
		internal InvoiceRequest(ProviderInfo provider, InvoiceType type)
		{
			this.Provider = provider;
			this.Identifier = Guid.NewGuid();
			this.Header = new HeaderInfo();
			this.Customer = new CustomerInfo();
			this.Items = new InvoiceItemCollection();
			this.InvoiceType = type;
		}

		/// <summary>
		/// Komponens neve loggoláskor
		/// </summary>
		internal override string Component
		{
			get { return "számla létrehozás"; }
		}

		/// <summary>
		/// Létrehozza a kéréshez tartozó XML kommunikációs objektumot
		/// </summary>
		/// <param name="authentication">Autentikációs adat</param>
		/// <param name="provider">Kibocsátói adat</param>
		/// <returns>Kommunikációs objektum</returns>
		internal R.xmlszamla GenerateForRequest(Authentication authentication, ProviderInfo provider)
		{
			return new R.xmlszamla
			{
				beallitasok = authentication.CreateForRequest(this.DownloadPdf ? (this.InstanceCount == 0 ? 1 : this.InstanceCount) : 0),
				fejlec = this.Header.CreateForRequest(),
				elado = this.Provider.CreateForRequest(),
				vevo = this.Customer.CreateForRequest(),
				tetelek = this.Items.CreateForRequest(),
			};
		}

		/// <summary>
		/// Hivatkozott számla beállítása (dijbekérő, előleg, stornó, vagy helyesbítő számla esetén)
		/// </summary>
		/// <param name="invoice">A számla amire a hivatkozás történik</param>
		/// <param name="customer">Vevőt másolja-e</param>
		/// <param name="items">Tételeket másolja-e</param>
		public void Reference(InvoiceRequest invoice, bool customer = true, bool items = false)
		{
			if (customer)
			{
				this.Customer = invoice.Customer;
			}
			if (items)
			{
				foreach (var item in invoice.Items)
				{
					this.Items.Items.Add(item);
				}
			}
		}

		/// <summary>
		/// Ellenőrzi a számla kérelem kötelező mezőit
		/// </summary>
		/// <returns></returns>
		internal override ValidationResult Validate()
		{
			var ret = base.Validate();

			ret.Merge(this.Customer.Validate());
			ret.Merge(this.Header.Validate());
			ret.Merge(this.Items.Validate());
			ret.Merge(this.Provider.Validate());

			return ret;
		}
	}
}
